#include "cryptstring.h"
#include <QCryptographicHash>
#include <QDateTime>

CryptString::CryptString(const QString &data): _data(data)
{

}

QString CryptString::generateMD5() const
{
     return QCryptographicHash::hash(_data.toUtf8(), QCryptographicHash::Md5).toHex();
}

KVQuery::KVQuery()
{
    // 插入任意请求构造token都必需的两个字段：secret, t
    _map.insert("secret", "f6fdffe48c908deb0f4c3bd36c032e72");
    _map.insert("t", QString::number(QDateTime::currentMSecsSinceEpoch()));
}

void KVQuery::add(const QString &key, const QString &value)
{
    _map.insert(key, value);
}

void KVQuery::erase(const QString &key)
{
    _map.remove(key);
}

void KVQuery::clear()
{
    _map.clear();
}

QString KVQuery::getParameters()
{
    // 生成url中的参数列表，即各参数+token
    // GET /xsw/api/ptz/control?channelId=1&value=r&speed=67&t=1757934233035&token=xsw%7C0ff774fc7ac469075e39c3a582e868a0 HTTP/1.1
    // 例：上面的channelId=1&value=r&speed=67&t=1757934233035&token=xsw%7C0ff774fc7ac469075e39c3a582e868a0
    QString token = CryptString(getOrderedString()).generateMD5();
    this->erase("secret"); // 生成token后删除secret字段（url中并不携带该字段）
    add("token", token);
    QString parameters = getOrderedString();
    clear();
    return parameters;
}

QString KVQuery::getOrderedString() const
{
    // 对参数键值对按key值进行字典序排序后拼接
    // 例：channelId=1&secret=f6fdffe48c908deb0f4c3bd36c032e72&speed=67&t=1757934233035&value=r
    QString parameters;
    for (auto it = _map.begin(); it != _map.end(); ++it) {
        parameters.append(it.key()).append("=").append(it.value()).append("&");
    }
    parameters.chop(1); // 删除最后一个字符'&'
    return parameters;
}
